home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / impressario / src / libprintui / Utilities.c.z / Utilities.c
C/C++ Source or Header  |  1996-05-06  |  7KB  |  228 lines

  1. /**************************************************************************
  2.  *
  3.  *           Copyright (c)    1993 Silicon Graphics, Inc.
  4.  *            All Rights Reserved
  5.  *
  6.  *       THIS    IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  7.  *
  8.  * The copyright notice above does not evidence any actual of intended
  9.  * publication of such source code, and is an unpublished work by Silicon
  10.  * Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  11.  * the property of Silicon Graphics, Inc. Any use, duplication or
  12.  * disclosure not specifically authorized by Silicon Graphics is strictly
  13.  * prohibited.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  *
  17.  * Use, duplication or disclosure by the Government is subject to
  18.  * restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  19.  * Technical Data and Computer Software clause at DFARS 52.227-7013,
  20.  * and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  21.  * Supplement. Unpublished - rights reserved under the Copyright Laws of
  22.  * the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  23.  * Shoreline Blvd., Mountain View, CA 94039-7311
  24.  **************************************************************************
  25.  *
  26.  * File: Utilities.c
  27.  *
  28.  * Description: Utility functions for the Print UI library.
  29.  *
  30.  **************************************************************************/
  31.  
  32.  
  33. #ident "$Revision: 1.1 $"
  34.  
  35.  
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <string.h>
  39. #include <limits.h>
  40. #include <unistd.h>
  41. #include <pwd.h>
  42. #include <Xm/Xm.h>
  43. #include <Xm/TextF.h>
  44. #include "PuiI.h"
  45.  
  46.  
  47. /**************************************************************************
  48.  *
  49.  * Function: _PuiExpandFilenames
  50.  *
  51.  * Description: Performs shell meta character expansion on a list of
  52.  *    white-space separated filenames. Currently, only tilde expansion
  53.  *    is performed.
  54.  *
  55.  * Parameters:
  56.  *    fnames (I) - string of white-space separated filenames to expand
  57.  *
  58.  * Return: String of whitespace separated filenames with meta-characters
  59.  *    expanded. The storage for the string is allocated by the function
  60.  *    and must be freed by the caller when no longer needed.
  61.  *
  62.  **************************************************************************/
  63.  
  64. char* _PuiExpandFilenames(char *fnames)
  65. {
  66.     char *srcPtr, *fn, *loc = NULL;
  67.     char expFn[PATH_MAX];
  68.     char *expFnames = NULL;
  69.  
  70.     /*
  71.      * Expand the filenames
  72.      */
  73.     srcPtr = fnames;
  74.     while ((fn = strtok_r(srcPtr, " \t", &loc)) != NULL) {
  75.     srcPtr = NULL;
  76.     _PuiExpandTilde(fn, expFn);
  77.     if (expFnames) {
  78.         expFnames = (char*)XtRealloc(expFnames,
  79.             (strlen(expFnames)+strlen(expFn)) * sizeof(char) + 5);
  80.         (void)strcat(expFnames, " ");
  81.         (void)strcat(expFnames, expFn);
  82.     } else {
  83.         expFnames = (char*)XtMalloc(strlen(expFn) * sizeof(char) + 5);
  84.         (void)strcpy(expFnames, expFn);
  85.     }
  86.     }
  87.  
  88.     return expFnames;
  89. }
  90.  
  91.  
  92. /**************************************************************************
  93.  *
  94.  * Function: _PuiExpandTilde
  95.  *
  96.  * Description: If the specified filename begins with a tilde ('~')
  97.  *    character, this function will expand that character into a
  98.  *    home directory. The algorithm is as follows:
  99.  *
  100.  *    1. If the filename does not begin with a tilde, the filename
  101.  *       is simply copied to the output string.
  102.  *
  103.  *    2. If the filename begins with a '~' followed immediately by
  104.  *       '/' or the endof the string, the '~' is expanded into the
  105.  *       value of the HOME environment variable. If the HOME variable
  106.  *       is not defined, the tilde is left untouched and the entire
  107.  *       filename is copied to the output string.
  108.  *
  109.  *    3. If the filename begins with a '~' followed by a username,
  110.  *       the tilde is expanded into the specified user's home directory.
  111.  *
  112.  * Parameters:
  113.  *    fname (I) - filename to expand
  114.  *    expFname (O) - expanded filename. Note that storage for this
  115.  *            variable must be pre-allocated by the caller.
  116.  *            The storage need be no larger than PATH_MAX as
  117.  *            defined in limits.h.
  118.  *
  119.  * Return: none
  120.  *
  121.  **************************************************************************/
  122.  
  123. void _PuiExpandTilde(char *fname, char *expFname)
  124. {
  125.     register char *p, *c;
  126.     char *hptr, lname[256];
  127.     struct passwd *pw;
  128.  
  129.     /*
  130.      * Sanity check and init the parameters
  131.      */
  132.     if (expFname == NULL)
  133.     return;
  134.     *expFname = '\0';
  135.     if (fname == NULL)
  136.     return;
  137.  
  138.     /*
  139.      * See if the filename begins with a tilde
  140.      */
  141.     if (*fname != '~') {
  142.     (void)strcpy(expFname, fname);
  143.     return;
  144.     }
  145.  
  146.     /*
  147.      * Get a username after the tilde if any
  148.      */
  149.     for (p = lname, c = &fname[1]; *c && *c != '/'; *p++ = *c++)
  150.     ;
  151.     *p = '\0';
  152.  
  153.     /*
  154.      * If no username, get HOME env variable value
  155.      */
  156.     if (*lname == '\0') {
  157.     if ((hptr = getenv("HOME")) == NULL)
  158.         (void)strcpy(expFname, "~");
  159.     else
  160.         (void)strcpy(expFname, hptr);
  161.     }
  162.     /*
  163.      * If username specified after tilde, get user's login dir
  164.      */
  165.     else {
  166.     if ((pw = getpwnam(lname)) == NULL)
  167.         (void)sprintf(expFname, "~%s", lname);
  168.     else
  169.         (void)strcpy(expFname, pw->pw_dir);
  170.     }
  171.  
  172.     /*
  173.      * Copy the rest of the filename onto the end of the expanded
  174.      * filename
  175.      */
  176.     (void)strcat(expFname, c);
  177. }
  178.  
  179.  
  180. /**************************************************************************
  181.  *
  182.  * Function: _PuiCharacterVerifyCB
  183.  *
  184.  * Description: Checks the character entered at a type-in field against
  185.  *    a set of illegal characters and disallows what is illegal.
  186.  *
  187.  * Parameters:
  188.  *    widget (I) - widget which triggered the callback
  189.  *    badChars (I) - string of characters to disallow
  190.  *    callData (I) - text verify callback
  191.  *
  192.  * Return: none
  193.  *
  194.  **************************************************************************/
  195. /* ARGSUSED */
  196.  
  197. void _PuiCharacterVerifyCB(Widget widget, XtPointer badChars,
  198.                              XtPointer callData)
  199. {
  200.     register int len;
  201.     char *newStr;
  202.     XmTextVerifyCallbackStruct *verify = (XmTextVerifyCallbackStruct*)callData;
  203.  
  204.     /*
  205.      * Make sure we have something to process. Note that we send back
  206.      * a free'able empty string to avoid the Motif bug where the
  207.      * the heap can be corrupted when "" is initially set using
  208.      * XmTextFieldSetString.
  209.      */
  210.     len = verify->text->length;
  211.     if (verify->text->ptr == NULL || len == 0) {
  212.         verify->text->ptr = XtNewString("");
  213.         verify->doit = True;
  214.         return;
  215.     }
  216.  
  217.     /*
  218.      * Check the string against the string of invalid characters
  219.      */
  220.     newStr = (char*)XtCalloc(len + 5, sizeof(char));
  221.     (void)strncpy(newStr, verify->text->ptr, len);
  222.     if (strpbrk(newStr, (char*)badChars) == NULL)
  223.         verify->doit = True;
  224.     else
  225.         verify->doit = False;
  226.     XtFree((char*)newStr);
  227. }
  228.